package com.new1cloud.file.domain;

import com.new1cloud.file.config.UploadConfig;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FileUploadProcess implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 文件名
     */
    private String fileName;
    /**
     * 文件大小
     */
    private Long fileSize;
    /**
     * 文件的唯一标识码
     */
    private String fileHash;
    /**
     * 0表示上传进行中，1表示分片文件上传和聚合都已完成
     */
    private Integer uploadStatus;
    /**
     * 已完成上传的分片名，约定是以1开始的正整数命名分片文件
     */
    private List<Integer> completedChunkItem;
    /**
     * 每个分片的大小
     */
    private Long chunkSize;
    /**
     * 文件的远端url地址
     */
    private String uploadPath;

    /**
     * 检查是否已上传完成（但是分片文件合并未完成）
     * @param uploadProcess 上传进度信息
     * @return 是否全部的分片文件已上传完成 true表示分片文件都已经上传完成，但是合并未完成
     */
    public static Boolean checkCompleted(FileUploadProcess uploadProcess){
        if(Objects.equals(1, uploadProcess.getUploadStatus())){
            return false;
        }
        AtomicBoolean isCompleted = new AtomicBoolean(false);
        // 计算文件总分片数
        int chunkNum = (int) Math.ceil(1.0 * uploadProcess.getFileSize() / UploadConfig.getChunkSize());
        // 进行核对已上传的文件片号
        if(Objects.equals(chunkNum, uploadProcess.getCompletedChunkItem().size())) {
            uploadProcess.getCompletedChunkItem().stream().mapToInt(item -> item).max().ifPresent(item -> {
                if(Objects.equals(item, chunkNum)) {
                    isCompleted.compareAndSet(false, true);
                }
            });
        }
        return isCompleted.get();
    }

    /**
     * 获取上传完成的百分比值
     * @param fileUploadProcess FileUploadProcess
     * @return 上传完成的百分比值
     */
    public static Integer gotTransferPercentage(FileUploadProcess fileUploadProcess) {
        // 计算文件总分片数
        double chunkNum = Math.ceil(1.0 * fileUploadProcess.getFileSize() / UploadConfig.getChunkSize());
        return (int) ((fileUploadProcess.getCompletedChunkItem().size() / chunkNum) * 100);
    }

}